<html lang="en-US">

<head>
    
<title>「连载一」Go 介绍与环境安装 - 花落雨忧</title>

<meta property="og:title" content="「连载一」Go 介绍与环境安装 - 花落雨忧">



    



    
    <meta property="description" content="首先，根据对应的操作系统选择安装包 下载，在这里我使用的是 Centos 64 位系统，如下：
[&amp;hellip;] $ wget https://studygolang.com/dl/golang/go1.13.1.linux-amd64.tar.gz $ tar -zxvf go1.13.1.linux-amd64.tar.gz $ mv go/ /usr/local/ &amp;hellip;">
    <meta property="og:description" content="首先，根据对应的操作系统选择安装包 下载，在这里我使用的是 Centos 64 位系统，如下：
[&amp;hellip;] $ wget https://studygolang.com/dl/golang/go1.13.1.linux-amd64.tar.gz $ tar -zxvf go1.13.1.linux-amd64.tar.gz $ mv go/ /usr/local/ &amp;hellip;">
    






<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1">

<link rel="shortcut icon" href="https://www.lican.site/logo/logo.png" type="image/x-icon" />



<link rel="stylesheet" href="/css/style.min.css" />

<link rel="stylesheet" href="/css/reset.min.css" />




<script src="https://www.lican.site/js/highlight.min.js"></script>

<script>
hljs.configure({ ignoreUnescapedHTML: true })
hljs.highlightAll();
</script>


<script src="https://www.lican.site/js/jquery.min.js"></script>




<link href="https://www.lican.site/css/hugo-code.min.css" rel="stylesheet" />



    <style>
        .post-content img {
            max-width: 400px;
        }
    </style>
</head>

<body id="period" class="home blog">
    <a class="skip-content" href="#main">Press "Enter" to skip to content</a>
    <div id="overflow-container" class="overflow-container">
        <header class="site-header" id="site-header" role="banner">
    <div class="max-width">
        <div id="title-container" class="title-container">
            <div id="site-title" class="site-title"><a href="/">花落雨忧</a></div>
            <p class="tagline">思所及 力所行 方为真.</p>
        </div>
        
        <div id="menu-primary-container" class="menu-primary-container">
            <div class="icon-container">
            </div>
            <div id="menu-primary" class="menu-container menu-primary" role="navigation">
                <nav class="menu">
                    <ul id="menu-primary-items" class="menu-primary-items">
                        
                        
                        <li id="menu-item-0"
                            class="menu-item menu-item-type-custom menu-item-object-custom ">
                            <a href="/posts" aria-current="page" tabindex="0">首页</a></li>
                        
                        <li id="menu-item-1"
                            class="menu-item menu-item-type-custom menu-item-object-custom ">
                            <a href="/tech/" aria-current="page" tabindex="1">技术文档</a></li>
                        
                        <li id="menu-item-2"
                            class="menu-item menu-item-type-custom menu-item-object-custom ">
                            <a href="/article/" aria-current="page" tabindex="2">文章</a></li>
                        
                        <li id="menu-item-3"
                            class="menu-item menu-item-type-custom menu-item-object-custom ">
                            <a href="/project/" aria-current="page" tabindex="3">项目</a></li>
                        
                        <li id="menu-item-4"
                            class="menu-item menu-item-type-custom menu-item-object-custom ">
                            <a href="/about/" aria-current="page" tabindex="4">关于</a></li>
                        
                    </ul>
                </nav>
            </div>
        </div>
    </div>
</header>
        <div id="primary-container" class="primary-container">
            <div class="max-width">
                <section id="main" class="main" role="main">
                    <div id="loop-container" class="loop-container">
                        <div
                            class="post type-post status-publish format-standard hentry entry">
                            <article>
                                <div class="post-container">
                                    <div class="post-header">
                                        <h2 class="post-title">
                                            <a href="/posts/go/gin/2018-02-10-install/">「连载一」Go 介绍与环境安装</a>
                                        </h2>
                                        
                                        <div class="post-byline">Published on
                                            <a class="date" href="javascript:;">2018/02/10</a>
                                            
                                            
                                            
                                            By 
                                            <a class="author" href="javascript:;">煎鱼</a></div>
                                            
                                        
                                    </div>
                                    <div class="post-content">
                                        <h2 id="本文目标">本文目标</h2>
<ul>
<li>学会安装 Go。</li>
<li>知道什么是 Go。</li>
<li>知道什么是 Go modules。</li>
<li>了解 Go modules 的小历史。</li>
<li>学会简单的使用 Go modules。</li>
<li>了解 Gin，并简单跑起一个 Demo。</li>
</ul>
<h2 id="准备环节">准备环节</h2>
<h3 id="安装-go">安装 Go</h3>
<h4 id="centos">Centos</h4>
<p>首先，根据对应的操作系统选择安装包 <a href="https://studygolang.com/dl">下载</a>，在这里我使用的是 Centos 64 位系统，如下：</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sh" data-lang="sh">$ wget https://studygolang.com/dl/golang/go1.13.1.linux-amd64.tar.gz

$ tar -zxvf go1.13.1.linux-amd64.tar.gz

$ mv go/ /usr/local/
</code></pre></div><p>配置 /etc/profile</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sh" data-lang="sh">vi /etc/profile
</code></pre></div><p>添加环境变量 GOROOT 和将 GOBIN 添加到 PATH 中</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sh" data-lang="sh">export GOROOT<span style="color:#f92672">=</span>/usr/local/go
export PATH<span style="color:#f92672">=</span>$PATH:$GOROOT/bin
</code></pre></div><p>配置完毕后，执行命令令其生效</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sh" data-lang="sh">source /etc/profile
</code></pre></div><p>在控制台输入<code>go version</code>，若输出版本号则<strong>安装成功</strong>，如下：</p>
<pre><code>$ go version
go version go1.13.1 linux/amd64
</code></pre><h4 id="macos">MacOS</h4>
<p>在 MacOS 上安装 Go 最方便的办法就是使用 brew，安装如下：</p>
<pre><code>$ brew install go
</code></pre><p>升级命令如下：</p>
<pre><code>$ brew upgrade go
</code></pre><p>注：升级命令你不需要执行，但我想未来你有一天会用到的。</p>
<p>同样在控制台输入<code>go version</code>，若输出版本号则<strong>安装成功</strong>。</p>
<h3 id="了解-go">了解 Go</h3>
<h4 id="是什么">是什么</h4>
<blockquote>
<p>Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.</p>
</blockquote>
<p>上述为官方说明，如果简单来讲，大致为如下几点：</p>
<ul>
<li>Go 是编程语言。</li>
<li>谷歌爸爸撑腰。</li>
<li>语言级高并发。</li>
<li>上手快，入门简单。</li>
<li>简洁，很有特色。</li>
<li>国内使用人群逐年增多。</li>
</ul>
<h4 id="谁在用">谁在用</h4>
<p><img src="https://image.eddycjy.com/6d278b22a4c0bf29c6b89ece99cd6c88.jpg" alt="image"></p>
<h4 id="有什么">有什么</h4>
<p>那么大家会有些疑问，纠结 <code>Go</code> 本身有什么东西，我们刚刚设置的环境变量又有什么用呢，甚至作为一名老粉，你会纠结 GOPATH 去哪里了，我们一起接着往下看。</p>
<h5 id="目录结构">目录结构</h5>
<p>首先，我们在解压的时候会得到一个名为 <code>go</code> 的文件夹，其中包括了所有 <code>Go</code> 语言相关的一些文件，如下：</p>
<pre><code>$ tree -L 1 go
go
├── api
├── bin
├── doc
├── lib
├── misc
├── pkg
├── src
├── test
└── ...
</code></pre><p>在这之中包含了很多文件夹和文件，我们来简单说明其中主要文件夹的作用：</p>
<ul>
<li>api：用于存放依照 <code>Go</code> 版本顺序的 API 增量列表文件。这里所说的 API 包含公开的变量、常量、函数等。这些 API 增量列表文件用于 <code>Go</code> 语言 API 检查</li>
<li>bin：用于存放主要的标准命令文件（可执行文件），包含<code>go</code>、<code>godoc</code>、<code>gofmt</code></li>
<li>blog：用于存放官方博客中的所有文章</li>
<li>doc：用于存放标准库的 HTML 格式的程序文档。我们可以通过<code>godoc</code>命令启动一个 Web 程序展示这些文档</li>
<li>lib：用于存放一些特殊的库文件</li>
<li>misc：用于存放一些辅助类的说明和工具</li>
<li>pkg：用于存放安装<code>Go</code>标准库后的所有归档文件（以<code>.a</code>结尾的文件）。注意，你会发现其中有名称为<code>linux_amd64</code>的文件夹，我们称为平台相关目录。这类文件夹的名称由对应的操作系统和计算架构的名称组合而成。通过<code>go install</code>命令，<code>Go</code>程序会被编译成平台相关的归档文件存放到其中</li>
<li>src：用于存放 <code>Go</code>自身、<code>Go</code> 标准工具以及标准库的所有源码文件</li>
<li>test：存放用来测试和验证<code>Go</code>本身的所有相关文件</li>
</ul>
<h5 id="环境变量">环境变量</h5>
<p>你可能会疑惑刚刚设置的环境变量是什么，如下：</p>
<ul>
<li>GOROOT：<code>Go</code>的根目录。</li>
<li>PATH 下增加 <code>$GOROOT/bin</code>：<code>Go</code>的 <code>bin</code>下会存放可执行文件，我们把他加入 <code>$PATH</code> 后，未来拉下来并编译后的二进制文件就可以直接在命令行使用。</li>
</ul>
<p>那在什么东西都不下载的情况下，<code>$GOBIN</code> 下面有什么呢，如下：</p>
<pre><code>bin/ $ls
go  gofmt
</code></pre><ul>
<li>go：<code>Go</code> 二进制本身。</li>
<li>gofmt：代码格式化工具。</li>
</ul>
<p>因此我们刚刚把 <code>$GOBIN</code> 加入到 <code>$PATH</code> 后，你执行 <code>go version</code> 命令后就可以查看到对应的输出结果。</p>
<p>注：MacOS 用 brew 安装的话就不需要。</p>
<h4 id="放在哪">放在哪</h4>
<p>你现在知道 Go 是什么了，也知道 Go 的源码摆在哪了，你肯定会想，那我应用代码放哪呢，答案是在 <strong>Go1.11+ 和开启 Go Modules 的情况下摆哪都行</strong>。</p>
<h3 id="了解-go-modules">了解 Go Modules</h3>
<h4 id="了解历史">了解历史</h4>
<p>在过去，Go 的依赖包管理在工具上混乱且不统一，有 dep，有 glide，有 govendor&hellip;甚至还有因为外网的问题，频频导致拉不下来包，很多人苦不堪言，盼着官方给出一个大一统做出表率。</p>
<p>而在 Go modules 正式出来之前还有一个叫 dep 的项目，我们在上面有提到，它是 Go 的一个官方实验性项目，目的也是为了解决 Go 在依赖管理方面的问题，当时社区里面几乎所有的人都认为 dep 肯定就是未来 Go 官方的依赖管理解决方案了。</p>
<p>但是万万没想到，半路杀出个程咬金，Russ Cox 义无反顾地推出了 Go modules，这瞬间导致一石激起千层浪，让社区炸了锅。大家一致认为 Go team 实在是太霸道、太独裁了，连个招呼都不打一声。我记得当时有很多人在网上跟 Russ Cox 口水战，各种依赖管理解决方案的专家都冒出来发表意见，讨论范围甚至一度超出了 Go 语言的圈子触及到了其他语言的领域。</p>
<p>当然，最后，推成功了，Go modules 已经进入官方工具链中，与 Go 深深结合，以前常说的 GOPATH 终将会失去它原有的作用，而且它还提供了 GOPROXY 间接解决了国内访问外网的问题。</p>
<h4 id="了解-russ-cox">了解 Russ Cox</h4>
<p>在上文中提到的 Russ Cox 是谁呢，他是 Go 这个项目目前代码提交量最多的人，甚至是第二名的两倍还要多（从 2019 年 09 月 30 日前来看）。</p>
<p>Russ Cox 还是 Go 现在的掌舵人（大家应该知道之前 Go 的掌舵人是 Rob Pike，但是听说由于他本人不喜欢特朗普执政所以离开了美国，然后他岁数也挺大的了，所以也正在逐渐交权，不过现在还是在参与 Go 的发展）。</p>
<p>Russ Cox 的个人能力相当强，看问题的角度也很独特，这也就是为什么他刚一提出 Go modules 的概念就能引起那么大范围的响应。虽然是被强推的，但事实也证明当下的 Go modules 表现得确实很优秀，所以这表明一定程度上的 “独裁” 还是可以接受的，至少可以保证一个项目能更加专一地朝着一个方向发展。</p>
<h4 id="初始化行为">初始化行为</h4>
<p>在前面我们已经了解到 Go 依赖包管理的历史情况，接下来我们将正式的进入使用，首先你需要有一个你喜欢的目录，例如：<code>$ mkdir ~/go-application &amp;&amp; cd ~/go-application</code>，然后执行如下命令：</p>
<pre><code>$ mkdir go-gin-example &amp;&amp; cd go-gin-example

$ go env -w GO111MODULE=on

$ go env -w GOPROXY=https://goproxy.cn,direct

$ go mod init github.com/EDDYCJY/go-gin-example
go: creating new go.mod: module github.com/EDDYCJY/go-gin-example

$ ls
go.mod
</code></pre><ul>
<li><code>mkdir xxx &amp;&amp; cd xxx</code>：创建并切换到项目目录里去。</li>
<li><code>go env -w GO111MODULE=on</code>：打开 Go modules 开关（目前在 Go1.13 中默认值为 <code>auto</code>）。</li>
<li><code>go env -w GOPROXY=...</code>：设置 GOPROXY 代理，这里主要涉及到两个值，第一个是 <code>https://goproxy.cn</code>，它是由七牛云背书的一个强大稳定的 Go 模块代理，可以有效地解决你的外网问题；第二个是 <code>direct</code>，它是一个特殊的 fallback 选项，它的作用是用于指示 Go 在拉取模块时遇到错误会回源到模块版本的源地址去抓取（比如 GitHub 等）。</li>
<li><code>go mod init [MODULE_PATH]</code>：初始化 Go modules，它将会生成 go.mod 文件，需要注意的是 <code>MODULE_PATH</code> 填写的是模块引入路径，你可以根据自己的情况修改路径。</li>
</ul>
<p>在执行了上述步骤后，初始化工作已完成，我们打开 <code>go.mod</code> 文件看看，如下：</p>
<pre><code>module github.com/EDDYCJY/go-gin-example

go 1.13
</code></pre><p>默认的 <code>go.mod</code> 文件里主要是两块内容，一个是当前的模块路径和预期的 Go 语言版本。</p>
<h4 id="基础使用">基础使用</h4>
<ul>
<li>用 <code>go get</code> 拉取新的依赖
<ul>
<li>拉取最新的版本(优先择取 tag)：<code>go get golang.org/x/text@latest</code></li>
<li>拉取 <code>master</code> 分支的最新 commit：<code>go get golang.org/x/text@master</code></li>
<li>拉取 tag 为 v0.3.2 的 commit：<code>go get golang.org/x/text@v0.3.2</code></li>
<li>拉取 hash 为 342b231 的 commit，最终会被转换为 v0.3.2：<code>go get golang.org/x/text@342b2e</code></li>
<li>用 <code>go get -u</code> 更新现有的依赖</li>
<li>用 <code>go mod download</code> 下载 go.mod 文件中指明的所有依赖</li>
<li>用 <code>go mod tidy</code> 整理现有的依赖</li>
<li>用 <code>go mod graph</code> 查看现有的依赖结构</li>
<li>用 <code>go mod init</code> 生成 go.mod 文件 (Go 1.13 中唯一一个可以生成 go.mod 文件的子命令)</li>
</ul>
</li>
<li>用 <code>go mod edit</code> 编辑 go.mod 文件</li>
<li>用 <code>go mod vendor</code> 导出现有的所有依赖 (事实上 Go modules 正在淡化 Vendor 的概念)</li>
<li>用 <code>go mod verify</code> 校验一个模块是否被篡改过</li>
</ul>
<p>这一小节主要是针对 Go modules 的基础使用讲解，还没具体的使用，是希望你能够留个印象，因为在后面章节会不断夹杂 Go modules 的知识点。</p>
<p>注：建议阅读官方文档 <a href="https://github.com/golang/go/wiki/Modules">wiki/Modules</a>。</p>
<h2 id="开始-gin-之旅">开始 Gin 之旅</h2>
<h3 id="是什么-1">是什么</h3>
<blockquote>
<p>Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance &ndash; up to 40 times faster. If you need smashing performance, get yourself some Gin.</p>
</blockquote>
<p>Gin 是用 Go 开发的一个微框架，类似 Martinier 的 API，重点是小巧、易用、性能好很多，也因为 <a href="https://github.com/julienschmidt/httprouter">httprouter</a> 的性能提高了 40 倍。</p>
<h3 id="安装">安装</h3>
<p>我们回到刚刚创建的 <code>go-gin-example</code> 目录下，在命令行下执行如下命令：</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sh" data-lang="sh">$ go get -u github.com/gin-gonic/gin
go: downloading golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223
go: extracting golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223
go: finding github.com/gin-contrib/sse v0.1.0
go: finding github.com/ugorji/go v1.1.7
go: finding gopkg.in/yaml.v2 v2.2.3
go: finding golang.org/x/sys latest
go: finding github.com/mattn/go-isatty v0.0.9
go: finding github.com/modern-go/concurrent latest
...
</code></pre></div><h4 id="gosum">go.sum</h4>
<p>这时候你再检查一下该目录下，会发现多个了个 <code>go.sum</code> 文件，如下：</p>
<pre><code>github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW...
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW...
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 h1:t8FVkw33L+wilf2QiWkw0UV77qRpcH/JHPKGpKa2E8g=
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2...
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO...
...
</code></pre><p><code>go.sum</code> 文件详细罗列了当前项目直接或间接依赖的所有模块版本，并写明了那些模块版本的 SHA-256 哈希值以备 Go 在今后的操作中保证项目所依赖的那些模块版本不会被篡改。</p>
<h4 id="gomod">go.mod</h4>
<p>既然我们下载了依赖包，<code>go.mod</code> 文件会不会有所改变呢，我们再去看看，如下：</p>
<pre><code>module github.com/EDDYCJY/go-gin-example

go 1.13

require (
        github.com/gin-contrib/sse v0.1.0 // indirect
        github.com/gin-gonic/gin v1.4.0 // indirect
        github.com/golang/protobuf v1.3.2 // indirect
        github.com/json-iterator/go v1.1.7 // indirect
        github.com/mattn/go-isatty v0.0.9 // indirect
        github.com/ugorji/go v1.1.7 // indirect
        golang.org/x/sys v0.0.0-20190927073244-c990c680b611 // indirect
        gopkg.in/yaml.v2 v2.2.3 // indirect
)
</code></pre><p>确确实实发生了改变，那多出来的东西又是什么呢，<code>go.mod</code> 文件又保存了什么信息呢，实际上 <code>go.mod</code> 文件是启用了 Go modules 的项目所必须的最重要的文件，因为它描述了当前项目（也就是当前模块）的元信息，每一行都以一个动词开头，目前有以下 5 个动词:</p>
<ul>
<li>module：用于定义当前项目的模块路径。</li>
<li>go：用于设置预期的 Go 版本。</li>
<li>require：用于设置一个特定的模块版本。</li>
<li>exclude：用于从使用中排除一个特定的模块版本。</li>
<li>replace：用于将一个模块版本替换为另外一个模块版本。</li>
</ul>
<p>你可能还会疑惑 <code>indirect</code> 是什么东西，<code>indirect</code> 的意思是传递依赖，也就是非直接依赖。</p>
<h3 id="测试">测试</h3>
<p>编写一个<code>test.go</code>文件</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-go" data-lang="go"><span style="color:#f92672">package</span> <span style="color:#a6e22e">main</span>

<span style="color:#f92672">import</span> <span style="color:#e6db74">&#34;github.com/gin-gonic/gin&#34;</span>

<span style="color:#66d9ef">func</span> <span style="color:#a6e22e">main</span>() {
  <span style="color:#a6e22e">r</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">gin</span>.<span style="color:#a6e22e">Default</span>()
  <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">GET</span>(<span style="color:#e6db74">&#34;/ping&#34;</span>, <span style="color:#66d9ef">func</span>(<span style="color:#a6e22e">c</span> <span style="color:#f92672">*</span><span style="color:#a6e22e">gin</span>.<span style="color:#a6e22e">Context</span>) {
    <span style="color:#a6e22e">c</span>.<span style="color:#a6e22e">JSON</span>(<span style="color:#ae81ff">200</span>, <span style="color:#a6e22e">gin</span>.<span style="color:#a6e22e">H</span>{
      <span style="color:#e6db74">&#34;message&#34;</span>: <span style="color:#e6db74">&#34;pong&#34;</span>,
    })
  })
  <span style="color:#a6e22e">r</span>.<span style="color:#a6e22e">Run</span>() <span style="color:#75715e">// listen and serve on 0.0.0.0:8080
</span><span style="color:#75715e"></span>}
</code></pre></div><p>执行<code>test.go</code></p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sh" data-lang="sh">$ go run test.go
...
<span style="color:#f92672">[</span>GIN-debug<span style="color:#f92672">]</span> GET    /ping                     --&gt; main.main.func1 <span style="color:#f92672">(</span><span style="color:#ae81ff">3</span> handlers<span style="color:#f92672">)</span>
<span style="color:#f92672">[</span>GIN-debug<span style="color:#f92672">]</span> Environment variable PORT is undefined. Using port :8080 by default
<span style="color:#f92672">[</span>GIN-debug<span style="color:#f92672">]</span> Listening and serving HTTP on :8080
</code></pre></div><p>访问 <code>$HOST:8080/ping</code>，若返回<code>{&quot;message&quot;:&quot;pong&quot;}</code>则正确</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sh" data-lang="sh">curl 127.0.0.1:8080/ping
</code></pre></div><p>至此，我们的环境安装和初步运行都基本完成了。</p>
<h2 id="再想一想">再想一想</h2>
<p>刚刚在执行了命令 <code>$ go get -u github.com/gin-gonic/gin</code> 后，我们查看了 <code>go.mod</code> 文件，如下：</p>
<pre><code>...
require (
        github.com/gin-contrib/sse v0.1.0 // indirect
        github.com/gin-gonic/gin v1.4.0 // indirect
        ...
)
</code></pre><p>你会发现 <code>go.mod</code> 里的 <code>github.com/gin-gonic/gin</code> 是 <code>indirect</code> 模式，这显然不对啊，因为我们的应用程序已经实际的编写了 gin server 代码了，我就想把它调对，怎么办呢，在应用根目录下执行如下命令：</p>
<pre><code>$ go mod tidy
</code></pre><p>该命令主要的作用是整理现有的依赖，非常的常用，执行后 <code>go.mod</code> 文件内容为：</p>
<pre><code>...
require (
        github.com/gin-contrib/sse v0.1.0 // indirect
        github.com/gin-gonic/gin v1.4.0
        ...
)
</code></pre><p>可以看到 <code>github.com/gin-gonic/gin</code> 已经变成了直接依赖，调整完毕。</p>
<h2 id="参考">参考</h2>
<h3 id="本系列示例代码">本系列示例代码</h3>
<ul>
<li><a href="https://github.com/EDDYCJY/go-gin-example">go-gin-example</a></li>
</ul>
<h3 id="相关文档">相关文档</h3>
<ul>
<li><a href="https://github.com/gin-gonic/gin">Gin</a></li>
<li><a href="https://gin-gonic.github.io/gin/">Gin Web Framework</a></li>
<li><a href="https://book.eddycjy.com/golang/talk/goproxy-cn.html">干货满满的 Go Modules 和 goproxy.cn</a></li>
</ul>
<h2 id="关于">关于</h2>
<h3 id="修改记录">修改记录</h3>
<ul>
<li>第一版：2018 年 02 月 16 日发布文章</li>
<li>第二版：2019 年 10 月 01 日修改文章</li>
</ul>
<h2 id="heading">？</h2>
<p>如果有任何疑问或错误，欢迎在 <a href="https://github.com/EDDYCJY/blog">issues</a> 进行提问或给予修正意见，如果喜欢或对你有所帮助，欢迎 Star，对作者是一种鼓励和推进。</p>
<h3 id="我的公众号">我的公众号</h3>
<p><img src="https://image.eddycjy.com/8d0b0c3a11e74efd5fdfd7910257e70b.jpg" alt="image"></p>


                                        
                                        
                                        
                                        
                                    </div>

                                    
                                    
                                    

                                    
                                    <div class="post-meta">
                                        
                                        
                                        <div class="post-tags">
                                            <ul>
                                            
                                            <li>
                                                <a href="/tags/go" title="View all posts tagged match">go</a>
                                            </li>
                                            
                                            <li>
                                                <a href="/tags/gin" title="View all posts tagged match">gin</a>
                                            </li>
                                            
                                            </ul>
                                        </div>
                                        
                                        
                                        <nav class="further-reading">
                                            
                                            <div class="previous">
                                                <span>&lt;&lt; Prev</span>
                                                <a href="https://www.lican.site/article/%E4%BA%94%E7%8C%96%E4%BC%9A/"
                                                    rel="prev">五猖会</a> </div>
                                            
                                            
                                            <div class="next">
                                                <span>Next >></span>
                                                <a href="https://www.lican.site/posts/go/gin/2018-02-11-api-01/">「连载二」Gin搭建Blog API&#39;s （一）</a> 
                                            </div>
                                            
                                        </nav>
                                    </div>
                                    
                                    

                                    
                                    
                                    

                                </div>
                            </article>
                        </div>
                    </div>
                </section>
                <aside class="sidebar sidebar-primary" id="sidebar-primary" role="complementary">
    <h1 class="screen-reader-text">Sidebar</h1>
    

    
    
    <section id="text-2" class="widget widget_text">
        <div class="textwidget">
            
            <div id="profile">
                <div id="profile_picture"><img src="https://www.lican.site/logo/logo.png"></div>
                <div id="profile_intro">
                    <p><span class="name">Lican</span></p>
                    <p class="intro">全栈开发者，爱好造轮子。</p>
                </div>
            </div>
            
            <p>
                <script type="text/javascript">
                    (function ($) {
                        $(document).ready(function () {
                            var menuPrimaryContainer = $('#menu-primary-container');
                            var profile = $('#text-2');
                            $('#toggle-navigation').click(function () {
                                if (menuPrimaryContainer.hasClass('open')) {
                                    profile.removeClass('open');
                                } else {
                                    profile.addClass('open');
                                }
                            });
                        });
                    })(jQuery);
                </script>
            </p>
        </div>
    </section>
    
    
    
    
    
    <section id="text-5" class="widget widget_text">
        <h2 class="widget-title">开源项目</h2>
        <div class="textwidget">
            <div id="projects" style="line-height: 22px;">
                
                <a href="https://github.com/idoubi/gonews"
                    target="_blank">gonews</a>: &nbsp;Daily news for golang<br>
                
                <a href="https://github.com/idoubi/sql2struct"
                    target="_blank">sql2struct</a>: &nbsp;Generate go struct according to SQL<br>
                
                <a href="https://github.com/idoubi/goz"
                    target="_blank">goz</a>: &nbsp;Request library used in golang<br>
                
        </div>
    </section>
    
    

    
    
    
    
    

    
    
    

    
    
    

    
    
    
    
</aside>
            </div>
        </div>

        <footer id="site-footer" class="site-footer" role="contentinfo">
    <div class="max-width">
    </div>
    <div class="footer">
        <div id="footercontent">
            © lican.vip All rights reserved<br/>
            Built with Hugo Theme <a href="https://github.com/idoubi/hugo-theme-period" target="_blank">Period</a>
        </div>
    </div>
</footer>

<script>
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "https://hm.baidu.com/hm.js?e8351b6d4626d5881d439ea1f6184baa";
      var s = document.getElementsByTagName("script")[0]; 
      s.parentNode.insertBefore(hm, s);
    })();
</script>
    
    
    </div>
    
</body>

</html>